package com.wangyf.thread.c_018_semaphore;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * 测试Semaphore，使用场景 限流
 * Created by feng on 2021/1/13.
 * new Semaphore 构造参数 permits 许可证数量，同时允许几个线程同时允许
 * semaphore.acquire(); 申请许可，这时候 permits -1，当permits为0，其他线程申请许可会被阻塞
 * semaphore.release(); 释放许可，其他线程这时候可以获取到了
 */
public class SemaphoreTest {
    public static void main(String[] args) {
        // permits为1 同一时间只有1个线程运行，t1打印完t2才会打印，如果改为2 两个线程交替打印也就是可以同时执行
        Semaphore semaphore = new Semaphore(1);
        Semaphore semaphore2 = new Semaphore(1, true);
        new Thread(() -> {
            try {
                semaphore.acquire();
                System.out.println("T1 running");
                TimeUnit.MILLISECONDS.sleep(200);
                System.out.println("T1 end");
                semaphore.release();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        new Thread(() -> {
            try {
                semaphore.acquire();
                System.out.println("T2 running");
                TimeUnit.MILLISECONDS.sleep(200);
                System.out.println("T2 end");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
}
